package com.person.MybatisSpring;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class SpringUtils {
	 private static ApplicationContext applicationContext;  
	  
	    static{  
	        setApplicationContext();  
	    }  
	      
	    public static void setApplicationContext(){  
       //用到RequestContextHolder需要在web.xml配置org.springframework.web.context.request.RequestContextListener  
	        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();      
	        ServletContext servletContext = request.getSession().getServletContext();    
	        applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);  
	    }  
	  
	    public static ApplicationContext getApplicationContext() {  
	        return applicationContext;  
	    }  
	  
	    public static Object getBean(String beanId) throws BeansException {  
	        return applicationContext.getBean(beanId);  
	    }  
	      
	    public static <E> Map<String, E> getBeansOfType(Class<E> type){  
	        return applicationContext.getBeansOfType(type);  
	    }  
	    
	    public static <T> T getBeansOfClass(Class<T> clz){
	    	return applicationContext.getBean(clz);
	    }
	    /**
	     * 如果BeanFactory包含一个与所给名称匹配的bean定义，则返回true
	     *
	     * @param name
	     * @return boolean
	     */
	    public static boolean containsBean(String name) {
	        return applicationContext.containsBean(name);
	    }

	    /**
	     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到，将会抛出一个异常（NoSuchBeanDefinitionException）
	     *
	     * @param name
	     * @return boolean
	     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
	     *
	     */
	    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
	        return applicationContext.isSingleton(name);
	    }

	    /**
	     * @param name
	     * @return Class 注册对象的类型
	     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
	     *
	     */
	    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
	        return applicationContext.getType(name);
	    }

	    /**
	     * 如果给定的bean名字在bean定义中有别名，则返回这些别名
	     *
	     * @param name
	     * @return
	     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
	     *
	     */
	    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
	        return applicationContext.getAliases(name);
	    }
}
